﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows;
using CalculoPreciosUnitarios.BaseDeDatos.cotizararticuloDataSetTableAdapters;
using CalculoPreciosUnitarios.Logica.GestorObject.Articulo;
using MySql.Data.MySqlClient;

namespace CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Articulos
{
    public class articulosDB
    {
        private IFormatProvider config_local = new System.Globalization.CultureInfo("es-AR");
        public List<ArticuloCS> obtenerArticulos()
        {

            List<ArticuloCS> _articulos = new List<ArticuloCS>();
            articuloTableAdapter dbArticulos = new articuloTableAdapter();
            DataTable tablaArticulos = new DataTable();

            dbArticulos.Connection.Open();


            try
            {
                tablaArticulos = dbArticulos.GetData();

                foreach (DataRow items in tablaArticulos.Rows)
                {
                    ArticuloCS dataArticulo = new ArticuloCS();
                    dataArticulo.Codigo = items["id_articulo"].ToString();
                    dataArticulo.Detalle = items["descrip_art"].ToString();
                    dataArticulo.Precio = Convert.ToDecimal(items["precio_art"]);                    
                    _articulos.Add(dataArticulo);
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs articulosDB - metodo: obtenerArticulos :: " + mException.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                dbArticulos.Connection.Close();
            }

            return _articulos;
        }

        public List<ArticuloCS> alta_Articulo (ArticuloCS _articulo)
        {
            int iResult;
            articuloTableAdapter tablaArticulo = new articuloTableAdapter();
            DataTable mitablaArticulo = new DataTable();

            tablaArticulo.Connection.Open();
            MySqlTransaction mitransaccion = tablaArticulo.Connection.BeginTransaction();
            try
            {
                // Modificado por Bruno
                //"Confirmacion" es utilizado cuando cargamos por Excel
                if (busca_Articulo_por_Codigo(_articulo).Count > 0)
                {
                    MessageBox.Show("El codigo " + _articulo.Codigo + " ya se encuentra para los Articulos Cargados"); 
                    return obtenerArticulos();
                }
                //MessageBox.Show(_articulo.Codigo + " - " + _articulo.Detalle +" - "+_articulo.Precio);
                iResult = tablaArticulo.InsertQuery(_articulo.Codigo, _articulo.Detalle, _articulo.Precio);

                // Modificado por Bruno
                //"Confirmacion" es utilizado cuando cargamos por Excel
                if (iResult == 1)
                {
                    mitransaccion.Commit();
                    //MessageBox.Show("Operacion de inserción exitosa", "Información", MessageBoxButton.OK);
                }              
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: articulosDB :: Alta_Articulo :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaArticulo.Connection.Close();
            }
            return obtenerArticulos();
        }

        /** Hecho por Bruno
         * Utilizado para la carga masiva por Excel
         */
        public int alta_ArticuloPorExcel(ArticuloCS _articulo)
        {
            int resultado = 0;
            articuloTableAdapter tablaArticulo = new articuloTableAdapter();
            
            tablaArticulo.Connection.Open();
            MySqlTransaction mitransaccion = tablaArticulo.Connection.BeginTransaction();
            try
            {
                // Modificado por Bruno
                //"Confirmacion" es utilizado cuando cargamos por Excel
                if (busca_Articulo_por_Codigo(_articulo).Count > 0)
                {
                    return 1;
                }
                resultado = tablaArticulo.InsertQuery(_articulo.Codigo, _articulo.Detalle, _articulo.Precio);

                if (resultado == 1)
                {
                    mitransaccion.Commit();
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
            }
            finally
            {
                tablaArticulo.Connection.Close();
            }
            return resultado;
        }

        public List<ArticuloCS> baja_Articulo(ArticuloCS _articulo)
        {
            int iResult;
            articuloTableAdapter tablaArticulo = new articuloTableAdapter();
            DataTable mitablaArticulo = new DataTable();           

            tablaArticulo.Connection.Open();
            MySqlTransaction mitransaccion = tablaArticulo.Connection.BeginTransaction();
            try
            {                
                iResult = tablaArticulo.DeleteQuery(_articulo.Codigo);
                if (iResult == 1)
                {
                    mitransaccion.Commit();
                    //MessageBox.Show("Operacion de eliminación exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: articulosDB :: baja_Articulo :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaArticulo.Connection.Close();
            }
            return obtenerArticulos();
        }

        public List<ArticuloCS> actualizar_Articulo(ArticuloCS _articulo)
        {
            int iResult;
            articuloTableAdapter tablaArticulo = new articuloTableAdapter();
            DataTable mitablaArticulo = new DataTable();

            tablaArticulo.Connection.Open();
            MySqlTransaction mitransaccion = tablaArticulo.Connection.BeginTransaction();
            try
            {
                iResult = tablaArticulo.UpdateQuery(_articulo.Detalle, _articulo.Precio, _articulo.Codigo);
                if (iResult == 1)
                {
                    mitransaccion.Commit();
                    //MessageBox.Show("Operacion de actualización exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: articulosDB :: actualizar_Articulo :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaArticulo.Connection.Close();
            }
            return obtenerArticulos();
        }

        public List<ArticuloCS> cambiar_codigo_Articulo(ArticuloCS _nuevoArticulo, ArticuloCS _viejoArticulo)
        {
            int iResult;
            articuloTableAdapter tablaArticulo = new articuloTableAdapter();
            DataTable mitablaArticulo = new DataTable();

            tablaArticulo.Connection.Open();
            MySqlTransaction mitransaccion = tablaArticulo.Connection.BeginTransaction();
            try
            {
                iResult = tablaArticulo.UpdateAllQuery(_nuevoArticulo.Codigo, _nuevoArticulo.Detalle, _nuevoArticulo.Precio, _viejoArticulo.Codigo);
                if (iResult == 1)
                {
                    mitransaccion.Commit();
                    MessageBox.Show("Operacion de cambio exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: articulosDB :: cambiar_codigo_Articulo :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaArticulo.Connection.Close();
            }
            return obtenerArticulos();
        }

        public List<ArticuloCS> busca_Articulo_por_Codigo(ArticuloCS _articulo)
        {

            List<ArticuloCS> _articulos = new List<ArticuloCS>();
            articuloTableAdapter dbArticulos = new articuloTableAdapter();
            DataTable tablaArticulos = new DataTable();

            dbArticulos.Connection.Open();

            try
            {
                string _codigo = "%" + _articulo.Codigo + "%";
                tablaArticulos = dbArticulos.GetDataByID_articulo(_codigo);

                foreach (DataRow items in tablaArticulos.Rows)
                {
                    ArticuloCS dataArticulo = new ArticuloCS();
                    dataArticulo.Codigo = items["id_articulo"].ToString();
                    dataArticulo.Detalle = items["descrip_art"].ToString();
                    dataArticulo.Precio = Convert.ToDecimal(items["precio_art"]);
                    _articulos.Add(dataArticulo);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Class :: articulosDB :: busca_Articulo_por_Codigo :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                dbArticulos.Connection.Close();
            }
            return _articulos;
        }

        public ArticuloCS busca_Articulo_por_Codigo2(ArticuloCS _articulo)
        {

            List<ArticuloCS> _articulos = new List<ArticuloCS>();
            _articulos = busca_Articulo_por_Codigo(_articulo);
            ArticuloCS resultado = _articulos[0];
            
            return resultado;
        }

        public List<ArticuloCS> busca_Articulo_por_detalle(ArticuloCS _articulo)
        {

            List<ArticuloCS> _articulos = new List<ArticuloCS>();
            articuloTableAdapter dbArticulos = new articuloTableAdapter();
            DataTable tablaArticulos = new DataTable();

            try
            {
                string _detalle = _articulo.Detalle + "%";
                tablaArticulos = dbArticulos.GetDataByDescripcion(_detalle);

                foreach (DataRow items in tablaArticulos.Rows)
                {
                    ArticuloCS dataArticulo = new ArticuloCS();
                    dataArticulo.Codigo = items["id_articulo"].ToString();
                    dataArticulo.Detalle = items["descrip_art"].ToString();
                    dataArticulo.Precio = Convert.ToDecimal(items["precio_art"]);
                    _articulos.Add(dataArticulo);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Class :: articulosDB :: busca_Articulo_por_detalle :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
            }
            return _articulos;
        }

        public void actualizar_Precio(ArticuloCS _articulo)
        {
            int iResult;
            articuloTableAdapter tablaArticulo = new articuloTableAdapter();
            DataTable mitablaArticulo = new DataTable();

            tablaArticulo.Connection.Open();
            MySqlTransaction mitransaccion = tablaArticulo.Connection.BeginTransaction();
            try
            {
                iResult = tablaArticulo.UpdateAlonePrecio(_articulo.Precio, _articulo.Codigo);
                if (iResult == 1)
                {
                    mitransaccion.Commit();
                    MessageBox.Show("Operacion de Actualización exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: articulosDB :: actualizar_Precio :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaArticulo.Connection.Close();
            }            
        }

        public int CargarArticulos(List<ArticuloCS> articulos)
        {
            int resultadoConsulta = 1;

            if (articulos.Count > 0)
            {
                foreach (ArticuloCS item in articulos)
                {
                    resultadoConsulta *= alta_ArticuloPorExcel(item);
                }
            }

            return resultadoConsulta;
        }
    }
}
